package com.bms.dao;

import java.io.Serializable;
import java.util.List;

import org.hibernate.criterion.DetachedCriteria;

import com.bms.httpModel.Pager;

/**
 * 数据库基本操作CRUD
 * 
 * @author Lan
 * 
 * @param <T>
 *            实体entity
 * @param <PK>
 *            主键
 */
public interface BaseDao<T, PK extends Serializable> {

	/**
	 * 保存实体对象
	 * 
	 * @param entity
	 *            对象
	 * @return 主键ID
	 * @author Lan
	 */
	public PK save(T entity);

	/**
	 * 更新实体对象
	 * 
	 * @param entity
	 *            对象
	 * @author Lan
	 */
	public void update(T entity);

	/**
	 * 保存或更新对象
	 * 
	 * @param entity
	 *            对象
	 * @author Lan
	 */
	public void saveOrUpdate(T entity);

	/**
	 * 删除实体对象
	 * 
	 * @param entity
	 *            对象
	 * @author Lan
	 */
	public void delete(T entity);

	/**
	 * 查找对象集合
	 * 
	 * @param hql
	 * @param params
	 * @return List<T>
	 * @author Lan
	 */
	public List<T> find(String hql, Object... params);

	/**
	 * 查找对象集合,带分页
	 * 
	 * @param hql
	 * @param pager
	 *            分页类
	 * @param params
	 * @return 分页后的List<T>
	 * @author Lan
	 */
	public Pager<T> findByPager(String hql, Pager<T> pager, Object... params);

	/**
	 * 根据Pager对象进行查询(提供分页、查找、排序功能)
	 * 
	 * @param pager
	 * @return
	 */
	public Pager<T> findByPager(Pager<T> pager);

	/**
	 * 根据ID获取实体对象
	 * 
	 * @param id
	 *            主键ID
	 * @return 实体对象
	 * @author Lan
	 */
	public T get(PK id);

	/**
	 * 根据ID获取实体对象
	 * 
	 * @param id
	 *            主键ID
	 * @return 实体对象
	 * @author Lan
	 */
	public T load(PK id);

	/**
	 * 根据属性名和属性值获取实体对象.
	 * 
	 * @param propertyName
	 *            属性名称
	 * @param value
	 *            属性值
	 * @return 实体对象
	 * @author Lan
	 */
	public T get(String propertyName, Object value);

	/**
	 * 根据ID数组获取实体对象集合
	 * 
	 * @param ids
	 * @return 实体对象集合
	 * @author Lan
	 */
	public List<T> getList(PK[] ids);

	/**
	 * 根据已构建的动态查询语句查找对象集合
	 * 
	 * @param detachedCri
	 * @return
	 * @author Lan
	 */
	public List<T> getList(DetachedCriteria detachedCri);

	/**
	 * 根据属性名和属性值获取实体对象集合.
	 * 
	 * @param propertyName
	 *            属性名称
	 * @param value
	 *            属性值
	 * @return 实体对象集合
	 * @author Lan
	 */
	public List<T> getList(String propertyName, Object value);

	/**
	 * 根据属性名和实体对象中对应的属性值获取实体对象集合
	 * 
	 * @param entity
	 *            从实体中获取查找的属性对应的值
	 * @param propertyNames
	 *            查找的属性名称集合
	 * @return 实体对象集合
	 * @author Lan
	 */
	public List<T> getList(T entity, String... propertyNames);

	/**
	 * 根据属性名和实体对象中对应的属性值模糊获取实体对象集合
	 * 
	 * @param entity
	 *            从实体中获取查找的属性对应的值
	 * @param propertyNames
	 *            查找的属性名称集合
	 * @return 实体对象集合
	 * @author Lan
	 */
	public List<T> getLike(T entity, String... propertyNames);

	/**
	 * 获取所有实体对象集合
	 * 
	 * @return
	 * @author Lan
	 */
	public List<T> getAll();

	/**
	 * 获取实体对象总数
	 * select count(*) from entity
	 * @param paramsValues 为空:查找所有记录数，不为空:匹配where语句的参数查找记录数
	 * @return
	 * @author Lan
	 */
	public Long getTotalCount(Object... paramsValues);
}
